

#include "oled.h"
#include "stdlib.h"
#include "oledfont.h"  	 
#include "main.h"

#if OLED_MODE==1
//锟斤拷SSD1106写锟斤拷一锟斤拷锟街节★拷
//dat:要写锟斤拷锟斤拷锟斤拷锟�/锟斤拷锟斤拷
//cmd:锟斤拷锟斤拷/锟斤拷锟斤拷锟街� 0,锟斤拷示锟斤拷锟斤拷;1,锟斤拷示锟斤拷锟斤拷;
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
	DATAOUT(dat);	    
	if(cmd)
	  OLED_DC_Set();
	else 
	  OLED_DC_Clr();		   
	OLED_CS_Clr();
	OLED_WR_Clr();	 
	OLED_WR_Set();
	OLED_CS_Set();	  
	OLED_DC_Set();	 
} 	    	    
#else
//锟斤拷SSD1106写锟斤拷一锟斤拷锟街节★拷
//dat:要写锟斤拷锟斤拷锟斤拷锟�/锟斤拷锟斤拷
//cmd:锟斤拷锟斤拷/锟斤拷锟斤拷锟街� 0,锟斤拷示锟斤拷锟斤拷;1,锟斤拷示锟斤拷锟斤拷;
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{	
	uint8_t i;
	//uint8_t *pData=NULL;

	//*pData = dat;

	if(cmd)
	  OLED_DC_Set();
	else 
	  OLED_DC_Clr();		  
	OLED_CS_Clr();
	for(i=0;i<8;i++)
	{			  
		OLED_SCLK_Clr();
		if(dat&0x80)
		   OLED_SDIN_Set();
		else 
		   OLED_SDIN_Clr();
		OLED_SCLK_Set();
		dat<<=1;   
	}

	//HAL_SPI_Transmit( &hspi1 , pData , 1, 0xff);

	OLED_CS_Set();
	OLED_DC_Set();   	  
} 
#endif
	void OLED_Set_Pos(unsigned char x, unsigned char y) 
{ 
	OLED_WR_Byte(0xb0+y,OLED_CMD);
	OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
	OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); 
}   	  
//锟斤拷锟斤拷OLED锟斤拷示    
void OLED_Display_On(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC锟斤拷锟斤拷
	OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
	OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
}
//锟截憋拷OLED锟斤拷示     
void OLED_Display_Off(void)
{
	OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC锟斤拷锟斤拷
	OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
	OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
}		   			 
//锟斤拷锟斤拷锟斤拷锟斤拷,锟斤拷锟斤拷锟斤拷,锟斤拷锟斤拷锟斤拷幕锟角猴拷色锟斤拷!锟斤拷没锟斤拷锟斤拷一锟斤拷!!!	  
void OLED_Clear(void)  
{  
	uint8_t i,n;
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //锟斤拷锟斤拷页锟斤拷址锟斤拷0~7锟斤拷
		OLED_WR_Byte (0x00,OLED_CMD);      //锟斤拷锟斤拷锟斤拷示位锟矫★拷锟叫低碉拷址
		OLED_WR_Byte (0x10,OLED_CMD);      //锟斤拷锟斤拷锟斤拷示位锟矫★拷锟叫高碉拷址   
		for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); 
	} //锟斤拷锟斤拷锟斤拷示
}


//鍦ㄦ寚瀹氫綅缃樉绀轰竴涓瓧绗�,鍖呮嫭閮ㄥ垎瀛楃
//x:0~127
//y:0~63
//mode:0,鍙嶇櫧鏄剧ず;1,姝ｅ父鏄剧ず
//size:閫夋嫨瀛椾綋 16/12
void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t Char_Size,uint8_t mode)
{      	
	unsigned char c=0,i=0;	
	c=chr-' ';//寰楀埌鍋忕Щ鍚庣殑鍊�
	if(x>Max_Column-1){x=0;y=y+2;}
	if(mode)
	{
		if(Char_Size ==16)
		{
			OLED_Set_Pos(x,y);
			for(i=0;i<8;i++)
				OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
				OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
		}
		else
		{
			OLED_Set_Pos(x,y);
			for(i=0;i<6;i++)
			OLED_WR_Byte((F6x8[c][i]),OLED_DATA);
		}
	}
	else
	{
		if(Char_Size ==16)
		{
			OLED_Set_Pos(x,y);	
			for(i=0;i<8;i++)
				OLED_WR_Byte(~F8X16[c*16+i],OLED_DATA);
			OLED_Set_Pos(x,y+1);
			for(i=0;i<8;i++)
				OLED_WR_Byte(~F8X16[c*16+i+8],OLED_DATA);
		}
		else
		{
			OLED_Set_Pos(x,y);
			for(i=0;i<6;i++)
			OLED_WR_Byte(~(F6x8[c][i]),OLED_DATA);
		}
	}
}


//m^n锟斤拷锟斤拷
uint32_t oled_pow(uint8_t m,uint8_t n)
{
	uint32_t result=1;
	while(n--)result*=m;    
	return result;
}				  

//鏄剧ず鏁板瓧
//x,y :璧风偣鍧愭爣
//len :鏁板瓧鐨勪綅鏁�
//size:瀛椾綋澶у皬
//num:鏁板€�(0~4294967295);
void OLED_ShowNum(uint8_t x,uint8_t y,int num,uint8_t len,uint8_t size2,uint8_t mode)
{         	
	uint8_t t,temp;
	uint8_t enshow=0;

	if(num<0)
	{
		num=-num;
		OLED_ShowChar(x-7,y,'-',size2,mode);
	}
	else OLED_ShowChar(x-7,y,' ',size2,mode);
	for(t=0;t<len;t++)
	{
		temp=(num/oled_pow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				OLED_ShowChar(x+(size2/2)*t,y,' ',size2,mode);
				continue;
			}else enshow=1; 
		 	 
		}
	 	OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2,mode);
	}
} 

//鏄剧ず涓€涓瓧绗﹀彿涓�
void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size,uint8_t mode)
{
	unsigned char j=0;
	while (chr[j]!='\0')
	{		OLED_ShowChar(x,y,chr[j],Char_Size,mode);
			x+=8;
		if(x>120){x=0;y+=2;}
			j++;
	}
}


//鏄剧ず灏忔暟
//x,y:璧风偣鍧愭爣
//width,height:鍖哄煙澶у皬
//size:瀛椾綋澶у皬 12 16 24
//double鍨嬪皬鏁�
void OLED_Show_Decimal(uint8_t x,uint8_t y,float num,uint8_t size,uint8_t mode)
{
	uint8_t ss[10];
	sprintf((char *)ss, "%-7.2f  ", num);			//淇敼鏄剧ず绮惧害
	OLED_ShowString(x,y,ss,size,mode);
}


void OLED_Show_BMP(void)
{
	uint8_t t,i=0,adder=0;

	for(i=0;i<8;i++)
	{
		OLED_Set_Pos(0,0+i);
		for(t=0;t<128;t++)
		{
				OLED_WR_Byte(BMP[i][t],OLED_DATA);
				adder+=1;
		}
	}
}


void OLED_Show_32_bit(uint8_t x,uint8_t y,uint8_t state,uint8_t mode)
{
	uint8_t t,adder=0;
	if(!mode)
	{
		OLED_Set_Pos(x,y);
		for(t=0;t<8;t++)
		{
			state?OLED_WR_Byte(BMP_DUI[0][t],OLED_DATA):OLED_WR_Byte(BMP_CUO[0][t],OLED_DATA);
			adder+=1;
		}
	}
	else
	{
		OLED_Set_Pos(x,y);
		for(t=0;t<8;t++)
		{
			state?OLED_WR_Byte(BMP_DUI[0][t],OLED_DATA):OLED_WR_Byte(BMP_CUO[0][t],OLED_DATA);
			adder+=1;
		}
	}
}



//锟斤拷始锟斤拷SSD1306					    
void OLED_Init(void)
{ 	
 
    OLED_RST_Set();
	HAL_Delay(100);
	OLED_RST_Clr();
	HAL_Delay(100);
	OLED_RST_Set(); 
					  
	OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
	OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0锟斤拷锟揭凤拷锟斤拷 0xa1锟斤拷锟斤拷
	OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0锟斤拷锟铰凤拷锟斤拷 0xc8锟斤拷锟斤拷
	OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);//-not offset
	OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
	OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
	OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//
	OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
	OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
	
	OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ 
	OLED_Clear();
	OLED_Set_Pos(0,0);
}

//
//void OLED_Show_time(DS1302_Time_t* time)
//{
//
//	uint8_t ss[17];
//	sprintf((char *)ss, "time:20%02d-%02d-%02d", time->year,time->month,time->date);			//淇敼鏄剧ず绮惧害
//	OLED_ShowString(8,3,ss,12,1);
//	sprintf((char *)ss, "       %02d:%02d:%02d", time->hour,time->minute,time->second);			//淇敼鏄剧ず绮惧害
//	OLED_ShowString(8,4,ss,12,1);
//}








